﻿/**
 * @brief     TCP服务器端
 * @details   创建Tcp服务器
 * @author    Will.Yin
 * @version   1.0
 * @date      2021-07-08
 * @copyright Eoslift
 * @note
 */
#ifndef TCPSERVER_H
#define TCPSERVER_H

#include "common_global.h"

#include <QObject>
#include <QAbstractSocket>
#include <QHostAddress>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostInfo>

namespace Common {

	class COMMONSHARED_EXPORT TcpServer : public QObject
	{
		Q_OBJECT

	public:
		explicit TcpServer(QObject *parent = nullptr);
		~TcpServer();

	public:

		/**
		 * @brief getTcpServer 获取服务器
		 * @return
		 */
		QTcpServer * getTcpServer();

		/**
		 * @brief createServer 创建服务器
		 * @param strIp 服务器Ip
		 * @param port 服务器端口
		 * @return
		 */
		bool createServer(QString strIp, int port);

		/**
		 * @brief closeServer 关闭服务器
		 */
		void closeServer();

		/**
		 * @brief isListening 判断是否监听
		 * @return
		 */
		bool isListening();

		/**
		 * @brief sendInfoToNetwork 向客户端发送数据
		 * @param ip	客户端Ip
		 * @param port	客户端端口
		 * @param t_tcpSocket 连接的客户端
		 * @param buff 发送的消息
		 * @return
		 */
		bool sendMsgToClient(QString ip, int port, QTcpSocket *t_tcpSocket, QByteArray buff);

	Q_SIGNALS:
		/**
		 * @brief   signalServerLog 发生服务器的日志信息
		 * @param   steLog 日志信息
		 * @return
		 */
		void signalServerLog(QString steLog);

		/**
		 * @brief	signalConnectedClient 客户端链接
		 * @param	t_tcpSocket 连接的客户端
		 * @param	ip 客户端Ip
		 * @param	port 客户端端口
		 * @return 
		 */
		void signalConnectedClient(QTcpSocket *t_tcpSocket, QString ip, int port);

		/**
		 * @brief	signalDisconnectedClient 客户端断开
		 * @param	t_tcpSocket 连接的客户端
		 * @param	ip 客户端Ip
		 * @param	port 客户端端口
		 * @return 
		 */
		void signalDisconnectedClient(QTcpSocket *t_tcpSocket, QString ip, int port);

		/**
		 * @brief signalRecvClientMsg 触发接收了客户端的信息
		 * @param t_tcpSocket 连接的客户端
		 * @param ip 客户端Ip
		 * @param port 客户端端口
		 * @param recvMsg 接收的客户端消息
		 */
		void signalRecvClientMsg(QTcpSocket *t_tcpSocket, QString ip, int port, QByteArray recvMsg);

	private Q_SLOTS:
		/**
		 * @brief slotTcpServerConnection 监听到新的客户端连接请求
		 * @return
		 */
		void slotTcpNewConnection();

	private:
		QTcpServer * m_pTcpServer;                          // Tcp服务器
	};

}//namespace Common

#endif // TCPSERVER_H
